package cn.kais.drawer.bean;

import cn.kais.drawer.AxisUtil;
import cn.kais.drawer.Size;
import cn.kais.drawer.SizeUtil;
import cn.kais.drawer.UnitUtil;
import cn.kais.drawer.coms.TextCom;
import cn.kais.drawer.menu.MenuBean;
import cn.kais.drawer.menu.MenuScoreIcon;
import cn.kais.drawer.unit.UnitScore;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;

import java.awt.*;
import java.awt.font.TextAttribute;
import java.awt.image.BufferedImage;
import java.text.AttributedString;

public class BeanScore extends BeanBasic {

    public double score = 3.4; // 分数

    public int top;
    public int left;
    public int width;
    public int height;

    public Color bColor; // 背景颜色
    public Color fColor; // 字体颜色
    public String iColor; // icon 填充颜色

    public int iSize; // icon 大小

    public String preText = "¥"; // 前缀
    public JSONObject preTextStyle; // 前缀样式

    public Graphics2D sd; // 绘制

    public int count = 5; // 星星 个数
    public String iCode; // 图标类型
//    public MenuScoreIcon icon = MenuScoreIcon.STARS_A; // 图片类型

    public BeanScore(Graphics2D sd, JSONObject com) {
        menu = MenuBean.SCORE;
        this.sd = sd;
        this.top = com.getInteger("top");
        this.left = com.getInteger("left");
        this.width = com.getInteger("width");
        this.height = com.getInteger("height");

        this.score = com.getDouble("value");

        this.bColor = UnitUtil.toColor(com.getString("bgColor"));
        Color iconColor = UnitUtil.toColor(com.getString("iconColor"));
        this.iColor = UnitUtil.onColor2Hex(iconColor);
        this.fColor = UnitUtil.toColor(com.getString("fontColor"));

        this.iSize = com.getIntValue("fontSize");
        this.iCode = com.getString("iconStyle");

        this.preText = com.getString("preText");
        this.preTextStyle = com.getJSONObject("preTextStyle");
        this.preTextStyle.put("text", this.preText);

        this.create();
    }

    private void create() {
        // 背景
        sd.setColor(this.bColor);
        sd.fillRect(this.left, this.top, this.width, this.height);
        // 区域框
        if (this.isShowBorder) {
            new BeanBorder(this.sd, this.top, this.left, this.width, this.height);
        }

        System.out.println(this.preText);
        System.out.println(this.preTextStyle.toJSONString());
        TextCom text = null;
        if (StringUtils.isNotBlank(this.preText)) {
            text = this.onCreateText(this.preTextStyle);
            System.out.println(text.height);
            System.out.println(text.width);
            int y = 0;
            int alignType = this.preTextStyle.getIntValue("alignType");
            switch (alignType) {
                case 1: // 上对齐
                    // 1.正常绘制
                    break;
                case 3: // 下对齐
                    // 1.计算文本高度 top = (top + fontsize) + (height - fontsize)
                    y = this.height - text.height;
                    break;
                case 2: // 垂直居中
                    // 1.计算文本高度 top = (top + fontsize) + ((height - fontsize) / 2)
                    y = (this.height - text.height) / 2;
                    break;
            }
            this.sd.drawString(text.attr.getIterator(), this.left, y + this.top + text.height);
        }
        // 计算 评分部分宽度
        int textWidth = 0;
        int scoreWidth = this.width;
        if (null != text) {
            textWidth = text.width;
            scoreWidth = scoreWidth - text.width;
        }

//        Size size = SizeUtil.doCountScoreItemSize(this.count, scoreWidth, this.height);
//        int item_space = 0;
//        int item_top = 0;
//        if (size.isNormal) {
//            // 正常情况下 区域宽度 大于 item数量总和的宽度 会出现 间距
//            item_space = (scoreWidth - (size.width * this.count)) / (this.count - 1);
//        } else {
//            // 非正常情况 区域宽度 小于 item数量综合的宽度 需要重新计算每个item宽度 并产生 上下间距
//            item_top = (this.height - size.height) / 2;
//        }

        Size size = new Size(this.iSize, this.iSize);
        int item_space = 10;
        int item_top = (this.height - size.height) / 2;

        boolean ban = false; // 是否绘制过 半图 / 0.5分图
        for (int i = 1; i <= this.count; i++) {
            int x = AxisUtil.doCountScoreItemX(i, size.width, item_space);
            x = x + textWidth + item_space;
            if (i < this.score || i == this.score) {
                this.onCreateItem(size, x, item_top, "a"); // 全图
            } else if (i > this.score && !ban) {
                // 在这里生成时 如果评分数量为整数 可以少生成一张图，节省时间
                ban = true;
                if ((i - this.score) < 0.5) {
                    this.onCreateItem(size, x, item_top, "a"); // 全图
                } else {
                    this.onCreateItem(size, x, item_top, "b"); // 半图
                }
            } else {
                this.onCreateItem(size, x, item_top, "c"); // 空图
            }
        }

    }

    /**
     * 创建 评分的每一个icon
     *
     * @param size
     * @param x
     * @param t
     * @param state
     */
    private void onCreateItem(Size size, int x, int t, String state) {
        MenuScoreIcon icon = MenuScoreIcon.onParseCode(this.iCode, state);
        BufferedImage ima = UnitScore.iScoreBuffer(icon, this.iColor); // icon 流
        ima = SizeUtil.doResizePicture(ima, size.width, size.height);
        this.sd.drawImage(ima, x + this.left, this.top + t, null);
    }

    /**
     * 每个组件Json创建独立的 text组件
     *
     * @param com 组件Json
     */
    private TextCom onCreateText(JSONObject com) {
        String text = com.getString("text");

        String fontName = com.getString("font");
        int fontSize = com.getIntValue("fontSize");
        // 样式：加粗 斜体 下划线
        boolean isBold = com.getBoolean("isBold");  // 是否加粗
        boolean isItalic = com.getBoolean("isItaly"); // 是否斜体
        String isUnderline = com.getString("isUnderline"); // 是否下划线
        String isCenterline = com.getString("isCenterline"); // 是否中横线

        // 字体
        Font font = UnitUtil.toFont(fontName, fontSize, isBold, isItalic);
        FontMetrics metrics = this.sd.getFontMetrics(font);
        int fontHeight = metrics.getAscent() - metrics.getDescent() - metrics.getLeading();
        int fontWidth = metrics.stringWidth(text);

        // 绘制配置
        AttributedString as = new AttributedString(text);
        as.addAttribute(TextAttribute.FONT, font); // 文本字体
        as.addAttribute(TextAttribute.FOREGROUND, this.fColor); // 文本颜色
        if (null != isUnderline && !isUnderline.equals("none")) { // 下划线
            as.addAttribute(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);
        }
        if (null != isCenterline && !isCenterline.equals("none")) { // 中横线
            as.addAttribute(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON);
        }

        // 对齐方式
        int align = com.getIntValue("alignType");
        return new TextCom(as, fontWidth, fontHeight, align);
    }

}

